package main

import (
	"fmt"
	"sort"
)

type person struct {
	Name string
	Age  int
}

type personList []person
/* 重写父类Len()、Swap()、Less()三个方法 */
func (list personList) Len() int {
	return len(list)
}

func (list personList) Swap(i, j int) {
	list[i], list[j] = list[j], list[i]
}

// 如果index为i的元素小于index为j的元素，则返回true，否则返回false
func (list personList) Less(i, j int) bool {
	return list[i].Age < list[j].Age // 指定按Age属性、由小到大排序
}

func main() {
	people := personList{
		{"Bob", 31},
		{"John", 42},
		{"Michael", 17},
		{"Jenny", 26},
	}

	/* 1，对自定义结构体进行排序，按哪个字段排序由Less方法决定*/
	fmt.Println(people)
	sort.Sort(people)
	fmt.Println(people)

	/* 2，以下使用sort包内置好的IntSlice、Float64Slice、StringSlice分别进行排序，
	sort.go中已经实现了Len()、Swap()、Less()三个方法，因此自己不用再实现直接使用 */
	// 对自定义int类型数组以内置的IntSlice进行排序
	arr := []int{2, 1, 6, 5, 3}
	intList := sort.IntSlice(arr)
	fmt.Println(intList)
	sort.Sort(intList)
	fmt.Println(intList)

	// 对自定义的float64类型的数组以Float64Slice进行排序
	arr1 := []float64{3.1415926935, 2.101, 7.999, 5.01}
	float64List := sort.Float64Slice(arr1)
	fmt.Println(float64List)
	sort.Sort(float64List)
	fmt.Println(float64List)

	// 对自定义的string类型的数组进行排序
	strList := sort.StringSlice{"bc", "ac", "abd"}
	fmt.Println(strList)
	sort.Sort(strList)
	fmt.Println(strList)

}